package com.learn.a05_2_mars_photos.data

import com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFactory
import com.learn.a05_2_mars_photos.network.MarsApiService
import kotlinx.serialization.json.Json
import okhttp3.MediaType.Companion.toMediaType
import retrofit2.Retrofit

/**
 * 应用依赖容器接口 - 依赖注入控制中心
 *
 * 定义应用全局依赖项的提供契约，实现依赖注入（DI）模式
 */
interface AppContainer {
    /**
     * 火星照片数据仓库实例
     * @see NetworkMarsPhotosRepository
     */
    val marsPhotosRepository: MarsPhotosRepository
}

/**
 * 默认依赖容器实现类
 *
 * 初始化网络服务组件并构建数据仓库依赖链
 */
class DefaultAppContainer : AppContainer {
    /** Mars API 服务基地址 */
    private val baseUrl = "https://android-kotlin-fun-mars-server.appspot.com"

    /**
     * 构建 Retrofit 实例
     * 使用 kotlinx.serialization 作为 JSON 转换器
     */
    private val retrofit: Retrofit = Retrofit.Builder()
        .addConverterFactory(Json.asConverterFactory("application/json".toMediaType()))
        .baseUrl(baseUrl)
        .build()

    /**
     * 延迟初始化 Mars API 服务接口
     * 通过 Retrofit 动态生成服务实现类
     */
    private val retrofitService: MarsApiService by lazy {
        retrofit.create(MarsApiService::class.java)
    }

    /**
     * 实现数据仓库的依赖提供
     * 使用惰性初始化保证单例特性
     */
    override val marsPhotosRepository: MarsPhotosRepository by lazy {
        NetworkMarsPhotosRepository(retrofitService)
    }
}
